====== Création d'une lentilles (lens) pour unity ======
Il est conseillé de déjà consulter ce tutoriel, pour acquérir les bases, cette pages expliquera comment utiliser plus en profondeur la librairie singlet
===== Aperçus des fonctionnalités disponibles =====
L'idée d'ici est de créer une lense et un scope qui montrent toutes les possibilités à disposition par les lens et scope unity.
Il sera facilement compilable pour pouvoir réellement tester toutes les possibilités et afin d'avoir un affichage a jour. 
Ce tutoriel ne contiendra donc pas  d'images qui risquerai de rapidement devenirs obsolètes.

Nous nous appuirons sur singlet, une librairie que permet de créer plus facilement des lens et scope unity.
==== Création d'un projet ====

<code bash>
quickly create unity-lens ubuntu-fr-tutorial
</code>

Maintenant utilisons cette nouvelle lens : 
<code bash>
cd ubuntu-fr-tutorial
sudo quickly install
quickly run
</code>
Et aller voir dans le Tableau de Bord (Dash)

==== Les types de catégories ====

Nous avons actuellement un catégorie d'affichée : 
  *  ListViewCategory

Ouvrir le fichier ubuntu_fr_tutorial/__init__.py

On observe dans ce fichier 
  example_category = ListViewCategory("Examples", 'help')
Cela correspond donc à cette catégorie.

Nous allons la renommer et ajouter tous les types connus.

La doc officielle des type de catégories ((http://developer.ubuntu.com/api/ubuntu-12.04/python/Unity-5.0.html#Unity.CategoryRenderer)) nous propose 4 types : 
  * VERTICAL_TILE
  * HORIZONTAL_TILE
  * LIST_TILE
  * FLOW
Mais singlet que 2 : 
  * IconViewCategory  (VERTICAL_TILE) 
  * ListViewCategory (HORIZONTAL_TILE)

remplacer cette ligne pas les suivantes, la méthode permet de peupler une catégorie : 
<code python>
    list_view_category = ListViewCategory("ListViewCategory", 'help')
    icon_view_category = IconViewCategory("IconViewCategory", 'help')
    
    
    def populate_category(self, category, results):
        for i in xrange(15):
            results.append('https://wiki.ubuntu.com/Unity/Lenses/Singlet',
                     'ubuntu-logo',
                     category,
                     "text/html",
                     'Learn More',
                     'Find out how to write your Unity Lens',
                     'https://wiki.ubuntu.com/Unity/Lenses/Singlet')
            results.append('https://wiki.ubuntu.com/Unity/Lenses/Singlet',
                     'ubuntu-logo',
                    category,
                     "text/html",
                     'Test sur un très très très très grand texte hahahahahaha ! ',
                     'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec',
                     'https://wiki.ubuntu.com/Unity/Lenses/Singlet')
</code>

Remplaçons le contenu de la méthode search par : 
<code python>
        self.populate_category(self.list_view_category, results)
        self.populate_category(self.icon_view_category, results)
</code>

Et comme on parle français et qu'on a envie de pouvoir mettre des accents utf-8, ajouter un première ligne du fichier : 
<code ptyhon>
# -*-coding:utf-8 -*
</code>


Alors ok, ça fonctionne et on observe 2 types de catégorie, essayons quand memes les autres (singlet nous le permet, et c'est tant mieux !)  ! 

<code python>
    list_tile_category = Category("CategoryRenderer.LIST_TILE", 'help', Unity.CategoryRenderer.LIST_TILE)
    flow_category = Category("CategoryRenderer.FLOW", 'help', Unity.CategoryRenderer.FLOW)
</code>
<code python>
        self.populate_category(self.list_tile_category, results)
        self.populate_category(self.flow_category, results)
</code>

Nous ajouterons aussi les 2 imports suivants : 
<code python>
from singlet.lens.category import Category
from gi.overrides.Unity import Unity
</code>

Testez !

Bon, ok on comprend pourquoi il n'étaient pas inclus par défaut, je ne vois pas de différence avec IconViewCategory, mais ca valais le coup de tester.


<note help>Comment fait singlet pour connaître les catégories a afficher

En effet, ce sont juste des membre de notre classe ! </note>
 
Il utilise pour cela l'introspection : 
<code python>
     for aName, a in attrs.items():
           if isinstance(a, Unity.Scope):
                new_class._meta.scope_dict[aName] = a
                if not hasattr(meta, 'scope_order'):
                    new_class._meta.scope_order.append(aName)

            elif isinstance(a, Unity.Category):
                new_class._meta.category_dict[aName] = a
                if not hasattr(meta, 'category_order'):
                    new_class._meta.category_order.append(aName)
                setattr(new_class, aName, new_class._meta.category_order.index(aName))

            elif isinstance(a, Unity.Filter):
                new_class._meta.filter_dict[aName] = a
                if not hasattr(meta, 'filter_order'):
                    new_class._meta.filter_order.append(aName)

            else:
                setattr(new_class, aName, a)
</code>

On vois ici que elif isinstance(a, Unity.Category): trouve toute les catégories de notre classe
